#include <iostream>
#include <string.h>
using std::cout;
using std::endl;

class String {
   public:
    //默认构造函数
    String()
    : _pstr(new char[1])  // 空内容也要分配一个字节的空间，防止出现问题！
    {
        cout << "调用默认无参构造函数" << endl;
    }

    // 用户提供的构造函数
    String(const char* pstr)
    : _pstr(new char[strlen(pstr) + 1]())
    {
        strcpy(_pstr, pstr);
        cout << "调用有参构造函数" << endl;
    }

    // 拷贝构造函数
    String(const String &rhs)
    : _pstr(new char[strlen(rhs._pstr) + 1]())
    {
        strcpy(_pstr, rhs._pstr);
        cout << "调用拷贝构造函数" << endl;
    }

    // 赋值运算符函数
    // 四步走
    String &operator=(const String &rhs) {
        if (this != &rhs) {  // 1.考虑自复制
            delete[] _pstr;  // 2.回收左操作数原本的空间
            _pstr = new char[strlen(rhs._pstr) + 1]();  // 3.深拷贝
            strcpy(_pstr, rhs._pstr);
            cout << "调用赋值运算符函数" << endl;
        }
        return *this;  // 4.返回*this
    }

    // 析构函数
    ~String() {
        if (_pstr) {
            delete[] _pstr;
            _pstr = nullptr;
        }
        cout << "调用析构函数" << endl;
    }

    // 打印字符串
    void print() const { cout << _pstr << endl; }
    // 求字符串长度
    size_t length() const { return strlen(_pstr); }
    // 获取指向字符串的指针
    const char *c_str() const { return _pstr; }

   private:
    char *_pstr;
};

int main() {
    String str1;
    str1.print();

    String str2 = "Hello,world";
    String str3("wangdao");

    str2.print();
    str3.print();

    String str4 = str3;
    str4.print();

    str4 = str2;
    str4.print();

    return 0;
}

